/**
 * 
 */
package algorithme;

import java.util.ArrayList;
import java.util.HashMap;

import programme.Portefeuille;
import programme.PortefeuilleDeterministe;
import programme.PortefeuilleStochastique;
import programme.Programme;
import programme.Solution;
import programme.Variable;
import voisinages.ComplementAlpha;
import voisinages.Voisinage;

/**
 * @author port
 *
 */
public class VNS_PF extends VNS<Portefeuille> {

	boolean deterministe;
	PortefeuilleDeterministe pd;
	
	Voisinage voisinage;
	Glouton_PF glouton;

	public VNS_PF(Portefeuille p, boolean d){
		deterministe = d;
		prog = p;
		
		pd = (PortefeuilleDeterministe)prog;
		
		voisinage = new ComplementAlpha(prog);
	}

	@Override
	public Solution lancer() {

		condArretExterne = 10;
		KMax = 4;
	
		Solution X, X1, X2;
		
		System.out.println("Début VNS");

		// Trouver l'ensemble des structures de voisinage ?
		; // TODO

		System.out.println("Debut glouton");
		
		// Trouver une solution initiale X
		if (deterministe){
			glouton = new Glouton_PF<PortefeuilleDeterministe>(prog);
			X = glouton.lancer();
		}
		else{
			glouton = new Glouton_PF<PortefeuilleStochastique>(prog);
			X = glouton.lancer();
		}

		System.out.println("Fin glouton");
		
		int iteration = 0;
		int k;

		System.out.println("Debut Recherche");
		
		// tant que ! condition d'arret
		while( iteration <= condArretExterne ){

			k = 2;
			
			while( k < KMax ){

				System.out.println("Iteration " + iteration);
				
				iteration++;
				
				X1 = voisinage.mouvement(X, k);

				X2 = voisinage.mouvement(X1, k);
				
				System.out.println("fin optimum local");
				
				if (prog.getObjectif().eval(X2) < prog.getObjectif().eval(X)){
					X = X2;
					k = 2;
				}
				else
					k+=2;
			}

		}
		
		X.setResultat(prog.getObjectif().eval(X));
		return X;

	}

}
